def a_cosine_learning_rate(current_step, base_lr, warmup_steps, decay_steps):
    """
    余弦学习率预热: 学习率先从很小的数值线性增加到预设学习率，然后按照cos函数值进行衰减
    param: current_step: 当前步数
            base_lr: 预设的学习率
            warmup_steps: 需要预热的步数
            decay_steps: 衰减的步数

    return: 当前学习率

    example: >>> a_cosine_learning_rate(200, 1.0, 100, 900)
              <<< 0.9698463103929542
    """
    # 学习率为float类型，base用于确定当前步数于整个优化过程的位置
    # 若当前步数大于需要预热的步数则base为正，若当前步数小于需要预热的步数则base为负
    base = float(current_step - warmup_steps) / float(decay_steps)
    # 当前学习率为1+cos（base×Π）的和除以2再乘上预设的学习率
    learning_rate = (1 + math.cos(base * math.pi)) / 2 * base_lr
    return learning_rate
